/***
 * AOP 面向切面编程
 *  不在原有的核心方法中添加逻辑，保持原有的核心方法不变
 *  在调用原有的方法的之前调用其他的方法
 */

/**
 * 第一个版本V1.0 
 */

//核心方法
function core() {
  console.log("core");
}

Function.prototype.before = function (fn) {
  return () => {
    fn();
    this();
  };
};
//自定义一些逻辑
function fn() {
  console.log("fn");
}

core.before(fn)();
/*** V1.0 end */

/**
 * 第二个版本V2 start
 * 
 */
//在不改变原有方法的同时，在他之前或者之后
const core = () => {
	console.log("这是一个核心方法------->core")
}
//需要在core方法之前，或者在core方法之后写一些处理逻辑的方法
Function.prototype.before = function(before, after) {
	return () => {
		before();
		this();
		after();
	}
}
//自身业务
const beforeBE = function() {
	console.log("核心业务之前的方法------>before");
}
//之后的业务
const afterBE = function() {
	console.log("最后处理的逻辑------>after");
}
//包装函数
let newCore = core.before(beforeBE, afterBE);
//
newCore();
/** V2.0 end */